(PYTHON) Day - 5 Strings(1)

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다



HackerRank

Numpy 패키지와 관련된 내용은 수학적 내용들과 함께 다루기 위해 나중에 다시 정리하기로 했다.

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다:

Subdomain

  • Introduction
  • Basic Data Types
  • Strings
  • Sets
  • Math
  • Itertools
  • Collections
  • Date and Time
  • Errors and Exceptions
  • Classes
  • Built-Ins
  • Python Functionals
  • Regex and Parsing
  • XML
  • Closures and Decorators
  • Numpy
  • Debugging


Strings

기본 개념

sWAP cASE

대문자는 소문자로, 소문자는 대문자로 바꾸는 문제

HackerRank.com presents “Pythonist 2”.

hACKERrANK.COM PRESENTS “pYTHONIST 2”.

반사적으로 떠오르는 풀이 방법, 문자열의 문자 하나하나를 반복문을 통해 확인하며 대소문자를 바꿈
하지만 이는 굉장히 비효율적인 방법이다
String 타입은 immutable하기 때문에, 반복문을 지나면서 기존의 ans 변수가 수정되는 것이 아니라
새로운 String 객체를 만들어서 ans 변수에 선언되는 것이다

def swap_case(s):
ans = ""
for letter in s:
if letter.isupper() is True:
ans += letter.lower()
else:
ans += letter.upper()
return ans

if **name** == '**main**':
s = input()
result = swap_case(s)
print(result)

list comprehension을 사용한 방법과,
내장함수 swapcase() 를 사용하는 방법도 있다

각 수행시간을 측정해보면, list를 사용한 것이 가장 빠른 것을 알 수 있다

import time

def swap_case_1(s):
ans = ""
for letter in s:
if letter.isupper() is True:
ans += letter.lower()
else:
ans += letter.upper()
return ans

def swap_case_2(s):
ans = [i.lower() if i.isupper() else i.upper() for i in s]
return ''.join(ans)

def swap_case_3(s):
return s.swapcase()

if **name** == '**main**':
s = input()

start_1 = time.time()
result_1 = swap_case_1(s)
end_1 = time.time()

start_2 = time.time()
result_2 = swap_case_1(s)
end_2 = time.time()

start_3 = time.time()
result_3 = swap_case_1(s)
end_3 = time.time()

print('result_1: ', end_1 - start_1) # 5.4836273193359375e-05
print('result_2: ', end_2 - start_2) # 2.574920654296875e-05
print('result_3: ', end_3 - start_3) # 4.9114227294921875e-05

String Split and Join

입력되는 문자열의 띄어쓰기 부분을 - 문자로 대체하는 문제
split()join() 함수를 사용하는 간단한 문제

this is a string

this-is-a-string

split() 함수는 파라미터 값 주어진 구분자(delimiter)로 문자열을 잘라 list 타입 으로 반환한다
(default값은 ‘ ‘ 공백이다)
join() 함수는 문자열을 붙여주는데, 문자 사이 특정한 구분자를 넣고 싶으면 함수 앞에 (''.join() 여기서 ‘’ 부분) 넣어주면 된다

def split_and_join(line):
letters = line.split()
return '-'.join(letters)

if **name** == '**main**':
line = input()
result = split_and_join(line)
print(result)

join() 함수를 사용하지 않아도,
print() 함수 안에서 unpacking을 통해 문자열을 합칠 수 있다
(join() 함수를 사용하지 않는 것이 실행속도가 더 빠른 것을 볼 수 있다)

letters = [‘a’, ‘b’, ‘c’, ‘d’] 가 있을 때,
print(*letters) 를 하면
print(‘a’, ‘b’, ‘c’, ‘d’) 로 해석되기 때문에
a b c d 로 출력된다

import time

def split_and_join(line):
letters = line.split()
return '-'.join(letters)

if **name** == '**main**':
line = input()
start_1 = time.time()
print(split_and_join(line))
end_1 = time.time()

start_2 = time.time()
print(*line.split(), sep='-')
end_2 = time.time()

print('result_1: ', end_1 - start_1) # 7.891654968261719e-05
print('result_2: ', end_2 - start_2) # 5.412101745605469e-05

**


What’s Your Name

이름(first name, last name)을 입력받고 아래 문장에 넣어서 출력하는 문제
Hello firstname lastname! You just delved into python.

Ross
Taylor

Hello Ross Taylor! You just delved into python.

format() 함수를 사용하는 간단한 문제

def print_full_name(a, b):
print('Hello {} {}! You just delved into python.'.format(a, b))

if **name** == '**main**':
first_name = input()
last_name = input()
print_full_name(first_name, last_name)

old한 방식으로 %를 사용하는 방법과 그냥 쉼표 , 로 구분하는 방법이 있지만
그냥 format() 함수를 사용하는게 자료형을 생각하지 않아도 되고 가독성도 좋다

def print_full_name(a, b):
print('(Hello %s %s! You just delved into python.') % (a, b)) # 쉼표로 구분할 때 띄워쓰기가 들어가는 것을 주의! + 기호로 띄워쓰기를 생략할 수 있다 # print("Hello",a,b+"! You just delved into python.")

if **name** == '**main**':
first_name = input()
last_name = input()
print_full_name(first_name, last_name)